package com.example.readandwriteseparation.util;

import cn.hutool.core.util.StrUtil;
import com.example.readandwriteseparation.config.DataSourceHolder;
import com.example.readandwriteseparation.config.DynamicDataSource;
import lombok.extern.slf4j.Slf4j;

/**
 * @author qingyan 2021-08-30
 */
@Slf4j
public class SwitchDB {
    /**
     * 切换数据库对外方法,如果私有库id参数非0,则首先连接私有库，否则连接其他已存在的数据源
     * @param dbName 已存在的数据库源对象
     * @return 返回当前数据库连接对象对应的key
     */
    public static void change(String dbName) {
        toDB(dbName);
        //获取当前连接的数据源对象的key
        String currentKey = DataSourceHolder.getDataSourceKey();
        log.info("＝＝＝＝＝当前连接的数据库是:" + currentKey);
    }

    /**
     * 切换已存在的数据源
     * @param dbName
     */
    private synchronized static void toDB(String dbName) {
        String dbSourceKey = dbName.trim();
        if (StrUtil.isBlank(dbSourceKey)) {
            return;
        }
        String currentKey = DataSourceHolder.getDataSourceKey();
        //如果当前数据库连接已经是想要的连接，则直接返回
        if (StrUtil.equals(dbSourceKey, currentKey)) {
            return;
        }
        //判断储存动态数据源实例的map中key值是否存在
        if(DynamicDataSource.isExistDataSourceKey(dbSourceKey)){
            DataSourceHolder.setDataSourceKey(dbSourceKey);
            log.info("＝＝＝＝＝普通库: "+dbName+",切换完毕");
        }else {
            log.info("切换普通数据库时，数据源key=" + dbName + "不存在");
        }
    }

    public static void reset(){
        log.info("＝＝＝＝＝恢复源数据库");
        DataSourceHolder.clearDataSourceKey();
    }

}
